﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
///  每个模块的基类
///      1.保存自身注册的一系列消息
///      
/// </summary>
public class ManagerBase : MonoBase
{

    /// <summary>
    ///  处理自身的消息
    /// </summary>
    /// <param name="eventCode"></param>
    /// <param name="message"></param>
    public override void Excute(int eventCode, object message)
    {
        if (!dict.ContainsKey(eventCode))
        {
            Debug.Log("自理没有注册：" + eventCode);
            return;
        }

        //一旦注册过这个消息 给所有的脚本发过去
        List<MonoBase> list = dict[eventCode];
        for (int i = 0; i < list.Count; i++)
        {
            list[i].Excute(eventCode, message);
        }

    }

    /// <summary>
    ///   存储  消息的事件码 和 那个脚本关联 的字典
    ///   例如：
    ///     角色模块 有一个动作是 移动
    ///         移动模块需要关心这个事件 -->控制角色位置 进行移动
    ///         动画模块需要关心这个事件 -->控制角色播放移动动画
    ///         音效模块需要关心这个事件 -->控制角色移动的音效播放 脚步声
    /// </summary>
    private Dictionary<int, List<MonoBase>> dict = new Dictionary<int, List<MonoBase>>();

    /// <summary>
    ///   添加事件/注册事件 1 <--> 1
    /// </summary>
    /// <param name="eventCode"></param>
    /// <param name="mono"></param>
    public void Add(int eventCode, MonoBase mono)
    {
        List<MonoBase> mList = null;

        //之前没有注册过
        if (!dict.ContainsKey(eventCode))
        {
            mList = new List<MonoBase>();
            mList.Add(mono);
            dict.Add(eventCode, mList);
            return;
        }
        //之前注册过
        mList = dict[eventCode];
        mList.Add(mono);

    }

    /// <summary>
    ///   添加多个事件
    ///       一个脚本关心多个事件
    /// </summary>
    /// <param name="eventCodes"></param>
    /// <param name="mono"></param>
    public void AddMulti(int[] eventCodes, MonoBase mono)
    {
        for (int i = 0; i < eventCodes.Length; i++)
        {
            Add(eventCodes[i], mono);
        }
    }

    /// <summary>
    ///  移除事件
    /// </summary>
    /// <param name="eventCode"></param>
    /// <param name="mono"></param>
    public void Remove(int eventCode, MonoBase mono)
    {
        if (!dict.ContainsKey(eventCode))
        {
            Debug.Log("字典中没有注册这个事件" + eventCode);
            return;
        }

        List<MonoBase> mList = dict[eventCode];

        if (mList.Count == 1)
        {
            dict.Remove(eventCode);
        }
        else
        {
            mList.Remove(mono);
        }

    }

    /// <summary>
    ///   移除多个
    /// </summary>
    /// <param name="eventCodes"></param>
    /// <param name="mono"></param>
    public void RemoveMulti(int[] eventCodes, MonoBase mono)
    {
        for (int i = 0; i < eventCodes.Length; i++)
        {
            Remove(eventCodes[i], mono);
        }

    }

}
